const XlsxPopulate = require("xlsx-populate");
const CConsole = require("./customConsole");
const createPassword = require("./password");
const { chars, nums, signs } = require("./chars");

/**
 * 破解密码
 * @param {String} file 文件
 * @param {Number} maxLen 密码最大长度
 */
async function decipher (file, maxLen = 10) {
  CConsole.logBr(`===== 开始 =====`);
  CConsole.logBr(`要破译的文件：${file}`);
  // 检查文件是否存在密码
  const res = await openExcel(file)
  if(res){
    CConsole.logBr(`===== 结束（破解成功） =====`);
    CConsole.log('这个文件没有密码！')
    return
  }
  // 破解密码
  const charList = [...chars, ...nums, ...signs]; // 密码字符集
  const startIndex = [0]; // 开始索引
  const getPassword = createPassword(charList, startIndex, maxLen);
  action(file, getPassword)
}

// 递归破解密码
async function action(file, getPassword){
  const [password] = getPassword();
  if (!password) {
    CConsole.logBr(`===== 结束（破解失败） =====`);
    return;
  }

  CConsole.cover(`> ${password}`);
  const res = await openExcel(file, password);
  if (res) {
    CConsole.logBr(`===== 结束（破解成功） =====`);
    CConsole.logBr(`密码破译成功, 密码:${password}`);
    return;
  }

  action(file, getPassword);
}

async function openExcel(file, password) {
  try {
    await XlsxPopulate.fromFileAsync(file, { password });
    return true;
  } catch (error) {
    // console.error(error);
    return false;
  }
}

module.exports = decipher